package code.whmmm.util.simple;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * <p><b>
 * 时间 工具类
 * </b></p>
 * <br/>
 * 创建时间: 8/14/2019 1:52 PM
 *
 * @author Zero
 */
public class TimeUtil {

    private static final Logger log = LoggerFactory.getLogger(TimeUtil.class);

    private TimeUtil() {
    }

    /**
     * 获取 消耗的时间，
     * <pre>{@code
     *
     * // 返回值 示例 ，最大单位 为 "小时"
     *  1 分钟
     *  1.2 小时
     *  35 秒
     *
     * }</pre>
     *
     * @return 消费的时间
     */
    public static String getConsumeTime(Long start) {
        long l = TimeUtil.getTimestamp() - start;
        // 秒数
        int i = 0;
        double v = 0;
        String unit = " 毫秒";

        String suffix = "";
        if (l >= 1000) {
            i = new Long(l / 1000).intValue();
            unit = " 秒";

            if (i > 3600) {
                // 小时
                v = i / 3600;
                unit = " 小时";
            } else if (i > 60) {
                // 分钟
                v = i / 60.0;
                unit = " 分钟";
            } else {
                v = i;
            }
            v = (double) Math.round(v * 100) / 100;
            suffix = v + unit;
        } else {
            suffix = l + unit;
        }
        return suffix;
    }

    /**
     * 获取 消耗的时间，
     *
     * @param unit  开始时间戳
     * @param start 开始时的时间戳，毫秒时间戳
     * @return 消耗的时间
     */
    public static int getConsumeTime(TimeUnit unit, long start) {
        return 0;
    }

    /**
     * 获取 消耗的时间，
     *
     * @param unit  开始时间戳
     * @param start 开始时的时间戳，毫秒时间戳
     * @param end   结束时间戳 ，毫秒
     * @return 消耗的时间
     */
    public static int getConsumeTime(TimeUnit unit, long start, long end) {
        return 0;
    }

    /**
     * 例如 2019-10-10 05:05:05
     *
     * @return 时间字符串
     */
    public static String getTimeString() {
        return getTimeString(new Date());
    }

    /**
     * 获取去除秒后的 日期
     * <p>example: 2019-10-10 05:05</p>
     *
     * @param date {@link Date}
     * @return {@link String}
     */
    public static String getShortTimeString(Date date) {
        return getTimeString(date, "yyyy-MM-dd HH:mm");
    }


    /**
     * 例如 2019-10-10 05:05:05
     *
     * @return 时间字符串
     */
    public static String getTimeString(Date date) {
        return getTimeString(date, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * @param date    {@link Date}
     * @param pattern {@link  String } example: &emsp;  yyyy-MM-dd HH:mm:ss
     * @return 格式化日期 字符串
     */
    public static String getTimeString(Date date, String pattern) {
        return new SimpleDateFormat(pattern).format(date);
    }


    /**
     * 根据 unit(时间单位) 获取 对应的 毫秒数 <br/>
     * 例如 ： TimeUnit.SECONDS 返回  1000L
     *
     * @param unit 时间单位
     * @return 毫秒数
     */
    public static long getMillis(TimeUnit unit) {
        long time = 0L;
        switch (unit) {
            case DAYS:
                time = 86400000L;
                break;
            case HOURS:
                time = 3600000L;
                break;
            case MINUTES:
                time = 60000L;
                break;
            case SECONDS:
                time = 1000L;
                break;
            default:
                break;
        }

        return time;
    }

    /**
     * 获取当前时间戳
     *
     * @return 毫秒数
     */
    public static Long getTimestamp() {
        //  return new Date().getTime();
        return System.currentTimeMillis();
    }


    /**
     * 日期 转 时间。
     *
     * @param pattern 格式
     * @param timeStr 格式化候的 时间字符串
     * @return 0
     * @see
     */
    public static Date str2Date(String pattern, String timeStr) {
        Date date = null;
        try {
            date = new SimpleDateFormat(pattern).parse(timeStr);
        } catch (Exception e) {
            log.error("字符串转换日期->转换异常");
            log.error(e.getMessage(), e);
        }
        return date;
    }

    /**
     * 获取 格式化 日期字符串
     *
     * @param pattern 格式
     * @param date    日期
     * @return {@link String}
     */
    public static String getFormattedTimeString(String pattern, Date date) {
        if (date == null) {
            date = new Date();
        }
        return new SimpleDateFormat(pattern).format(date);
    }
}
